/**
 * 开发一个字典类，保存键值对数据  就是对应js的 Map
 * 操作
 *  根据键 删除
 *  循环每一个键值对
 *  键值对数量
 *  判断 某个键是否 存在
 *  设置某个键对应的值，不存在就添加
 */

interface Callback<K, V> {
    (key: K, value: V , i: number): void
}
// type Callback<K, V> = (key: K, value: V, i: number) => void

export class Dicionary<K, V>{
    private keys: K[] = []
    private vals: V[] = []

    constructor() {

    }


    // 设置某个键对应的值，不存在就添加
    set(key: K, value: V) {
        const index = this.keys.indexOf(key)
        if (index > -1) { // 存在
            this.vals[index] = value
        } else {
            this.keys.push(key)
            this.vals.push(value)
        }
    }

    // 循环每一个键值对
    forEach(callback: Callback<K, V>) {
        this.keys.forEach((key, i) => {
            callback(key, this.vals[i], i)
        })
    }

    delete(key: K) {
        const i = this.keys.indexOf(key)
        if (i > -1) { // 存在
            this.keys.splice(i, 1)
            this.vals.splice(i, 1)
        }
    }


    // 判断 某个键是否 存在
    has(key: K): boolean {
        return this.keys.includes(key)
    }

    // 键值对数量
    get size(): number {
        return this.keys.length
    }
}